// JavaScript 函数式编程

// 演示函数的 apply 方法的应用

// 使用 apply 创建一个函数 splat，它接受一个函数 fun，并返回一个函数
// 该返回的函数接受一个数组 array 并用 apply 来执行函数 fun
// 这样一来传入函数 splat 的数组的元素是函数 fun 的参数
function splat(fun) {
    return function(array) {
        // apply 函数：第一个参数：this 的值，第二个参数：执行函数的参数，数组的形式
        return fun.apply(null, array);
    }
}

var addArrayElements = splat(function(x, y) { return x + y; });
var result = addArrayElements([1, 2]);
console.log(result)


// JavaScript 可以随时多个任意类型的参数来调用任意一个函数
// 创建一个功能与 splat 相反的函数 unsplat
// 它接受一个函数 fun 并返回另一个接受任意参数的函数
// 将参数转为数组并传入函数 fun 并调用
function unsplat(fun) {
    return function() {
        // Array.from() 将元素转换成数组
        return fun.call(null, Array.from(arguments));
    }
}

var joinElements = unsplat(function(array) { return array.join(" "); });
var joinResult = joinElements(1, 2, 3, 4);
console.log(joinResult);